import 'dart:convert';
import 'dart:io';

import 'package:m_todo/domain/entity/account_entity.dart';

/// 配置文件工具类
class ConfigFileUtil {
  final String _configName = '.todo-config';

  /// 获取配置文件
  Future<_AppConfig> getConfig() async {
    var file = await _getConfigFile();
    var config = await _parseConfigByFile(file);
    return config;
  }

  /// 更新配置文件
  Future<void> updateConfig(Function(_AppConfig) update) async {
    var file = await _getConfigFile();
    var config = await _parseConfigByFile(file);
    update.call(config);
    await _saveConfigFile(file, config);
  }

  /// 解析配置文件
  Future<_AppConfig> _parseConfigByFile(File file) async {
    var fileContent = await file.readAsString();

    if (fileContent.isEmpty) {
      fileContent = '{}';
    }

    // 解析json加载到内存
    var obj = jsonDecode(fileContent);
    return _AppConfig.fromJson(obj);
  }

  /// 获取储存文件，如果不存在会新创建
  Future<File> _getConfigFile() async {
    File file = File('${Directory.systemTemp.path}/mtodo/$_configName');

    if (!await file.exists()) {
      await file.create(recursive: true);
    }

    return file;
  }

  /// 储存config到file
  Future<File> _saveConfigFile(File file, _AppConfig config) {
    return file.writeAsString(jsonEncode(config.toJson()), flush: true);
  }

  /// 获取配置文件地址
  Future<String> getPath() async {
    var file = await _getConfigFile();
    return file.absolute.path;
  }
}

class _AppConfig {
  /// 配置的账号
  List<AccountEntity>? accounts;

  /// 登陆的账号
  AccountEntity? loginAccount;

  /// 是否初始化数据库
  bool isEnableDB = false;

  _AppConfig({this.accounts, this.loginAccount, this.isEnableDB = false});

  _AppConfig.fromJson(dynamic json) {
    accounts = [];
    json['accounts']?.forEach((v) {
      accounts?.add(AccountEntity.fromJson(v));
    });
    var loginAccountJson = json['loginAccount'];
    if (loginAccountJson != null) {
      loginAccount = AccountEntity.fromJson(loginAccountJson);
    }
    isEnableDB = json['isEnableDB'] ?? false;
  }

  Map<String, dynamic> toJson() {
    final map = <String, dynamic>{};
    if (accounts != null) {
      map['accounts'] = accounts!.map((v) => v.toJson()).toList();
    }
    map['loginAccount'] = loginAccount?.toJson();
    map['isEnableDB'] = isEnableDB;
    return map;
  }
}
